﻿using System;
using System.Collections;
using System.Linq;
using System.Web.UI;
using ASPNETVN.PORTAL.Components.Configuration.Settings;
using ASPNETVN.PORTAL.Components.Helpers;
using ASPNETVN.PORTAL.Components.Security;
using ASPNETVN.PORTAL.Components.UI;
using ASPNETVN.PORTAL.Components.UI.DataTypes;
using ASPNETVN.PORTAL.Components.Share;
using System.Collections.Generic;

namespace ASPNETVN.PORTAL.Modules.DOWNLOAD.MENU
{
    public partial class Main : PortalModuleControl
    {
        public Main()
        {
            ModuleSettingItem setting = new ModuleSettingItem(new StringDataType());
            setting.Value = Guid.Empty.ToString();
            setting.Name = "ModuleID của Module DOWNLOAD";
            setting.Description = "ModuleID của Module DOWNLOAD";
            setting.SortOrder = 1;
            this.BaseSettings.Add("DOWNLOAD.ModuleID", setting);

            setting = new ModuleSettingItem(new StringDataType());
            setting.Value = "Full";
            setting.Name = "Hình thức nhập liệu";
            setting.Description = "Hình thức nhập liệu";
            setting.SortOrder = 1;
            this.BaseSettings.Add("InputOption", setting);

            // Cho phép hiển thị các liên kết: Mới cập nhật.
            setting = new ModuleSettingItem(new BooleanDataType(true));
            setting.Name = "Display Option: Newest Items";
            setting.Description = "Display Option: Newest Items";
            setting.SortOrder = 3;
            this.BaseSettings.Add("DisplayOptionNone", setting);

            // Cho phép hiển thị các liên kết: Xem nhiều nhất.
            setting = new ModuleSettingItem(new BooleanDataType(true));
            setting.Name = "Display Option: Top View";
            setting.Description = "Display Option: Top View";
            setting.SortOrder = 4;
            this.BaseSettings.Add("DisplayOptionTopView", setting);

            // Cho phép hiển thị các liên kết: Tải về nhiều nhất.
            setting = new ModuleSettingItem(new BooleanDataType(true));
            setting.Name = "Display Option: Top Download";
            setting.Description = "Display Option: Top Download";
            setting.SortOrder = 5;
            this.BaseSettings.Add("DisplayOptionTopDownload", setting);

            // Cho phép hiển thị các liên kết: Bình luận nhiều nhất.
            setting = new ModuleSettingItem(new BooleanDataType(true));
            setting.Name = "Display Option: Top Comment";
            setting.Description = "Display Option: Top Comment";
            setting.SortOrder = 6;
            this.BaseSettings.Add("DisplayOptionTopComment", setting);
        }

        protected string GetAddEditItemUrl(int itemID)
        {
            Hashtable settings = this.Settings;
            if (settings["InputOption"].ToString().Equals("Simple"))
            {
                return HttpUrlBuilder.BuildAddEditUrl(this.ModuleID, itemID, "SimpleAddEditItem", "");
            }
            return HttpUrlBuilder.BuildAddEditUrl(this.ModuleID, itemID, "AddEditItem", "");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            Hashtable settings = this.Settings;
            Guid moduleID = new Guid(settings["DOWNLOAD.ModuleID"].ToString());

            this.ModuleTitle.AddUrl = this.GetAddEditItemUrl(0);

            // Left Pane.
            string url;
            LiteralControl literal = new LiteralControl("");
            bool isNewestView = Convert.ToBoolean(settings["DisplayOptionNone"].ToString());
            bool isTopView = Convert.ToBoolean(settings["DisplayOptionTopView"].ToString());
            bool isTopDownload = Convert.ToBoolean(settings["DisplayOptionTopDownload"].ToString());
            bool isTopComment = Convert.ToBoolean(settings["DisplayOptionTopComment"].ToString());

            if (isNewestView || isTopView || isTopDownload || isTopComment)
            {
                literal.Text += "<div class='MenuLink'>";
                // OptionView = Newest Items.
                if (isNewestView)
                {
                    url = ResolveClientUrl(HttpUrlBuilder.BuildModulePageUrl(moduleID, 0, ModulePages.ItemList, "optionview=None"));
                    literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Mới cập nhật</a>", url);
                }

                // OptionView = Most View.
                if (isTopView)
                {
                    url = ResolveClientUrl(HttpUrlBuilder.BuildModulePageUrl(moduleID, 0, ModulePages.ItemList, "optionview=TopView"));
                    literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Xem nhiều nhất</a>", url);
                }
                
                // OptionView = Most Download.

                if (isTopDownload)
                {
                    url = ResolveClientUrl(HttpUrlBuilder.BuildModulePageUrl(moduleID, 0, ModulePages.ItemList, "optionview=TopDownload"));
                    literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Tải về nhiều nhất</a>", url);
                }
                
                // OptionView = Most Comment.
                if (isTopComment)
                {
                    url = ResolveClientUrl(HttpUrlBuilder.BuildModulePageUrl(moduleID, 0, ModulePages.ItemList, "optionview=TopComment"));
                    literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Bình luận nhiều nhất</a>", url);
                }
                literal.Text += "</div>";
            }
            // Manager Permission.
            if (PortalSecurity.HasManageAuthorization(moduleID))
            {
                literal.Text += "<div class='MenuLinkGroup'>Quản trị nội dung</div>";
                literal.Text += "<div class='MenuLink'>";

                url = this.GetAddEditItemUrl(0);
                url = url.Substring(2);
                literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Tạo mới</a>", url);

                url = HttpUrlBuilder.BuildShareUrl(moduleID, 0, "CategoryManager");
                url = url.Substring(2);
                literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Danh mục</a>", url);

                url = HttpUrlBuilder.BuildAddEditUrl(moduleID, 0, "ItemManager");
                url = url.Substring(2);
                literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» Danh sách</a>", url);

                literal.Text += "</div>";
            }

            IList<Category> allCategories = Category.SelectCollectionAll(moduleID);
            IList<Category> topCategories = allCategories.Where(x => x.ParentID == 0).OrderBy(x => x.SortOrder).ToList();
            foreach (Category topCategory in topCategories)
            {
                url = HttpUrlBuilder.BuildModulePageUrl(moduleID, 0, ModulePages.ItemList, "categoryid={0}", topCategory.ID);
                url = url.Substring(2);
                literal.Text += string.Format("<div class='MenuLinkGroup'><a href='{0}'>{1}</a></div>", url, topCategory.Title);
                Category category = topCategory;
                IList<Category> childCategories = allCategories.Where(x => x.ParentID == category.ID).OrderBy(x => x.SortOrder).ToList();

                foreach (Category childCategory in childCategories)
                {
                    url = HttpUrlBuilder.BuildModulePageUrl(moduleID, 0, ModulePages.ItemList, "categoryid={0}", childCategory.ID);
                    url = url.Substring(2);

                    literal.Text += string.Format("<a class='MenuLinkItem' href='{0}'>» {1}</a>", url, childCategory.Title);
                }
            }
            literal.Text += "</div>";
            ContentPane.Controls.Add(literal);

            // Flag to hide or show left pane.
            if (!string.IsNullOrEmpty(Request.QueryString["LeftPanel"]))
            {
                if (Request.QueryString["LeftPanel"].ToLower() == "hidden")
                {
                    ContentPane.Visible = false;
                }
            }

            // Place Holder.
            LiteralControl placeholder = new LiteralControl();
            string style = string.Format("width:{0}; height:{1}", this.Settings["PlaceHolderWidth"], this.Settings["PlaceHolderHeight"]);
            placeholder.Text += string.Format("<div style='{0}'></div>", style);
            ContentPane.Controls.Add(placeholder);
        }
    }
}